package com.zsq.thread.test5;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * todo 解决同样的问题的更高效的方法 ,使用atomic 类
 * todo actomic类本身方法都是原子性的,但不能保证多个方法连续调用是原子性的
 *
 * todo CAS(无锁优化 自旋) Compare And Set
 * todo cas(V,Expected ,NewValue)  V当前值3  Expected期望值3(4)  NewValue欲修改数值5
 * todo  -if V==Expected  当前值=期望值  3==3
 * todo      V=NewValue   当前值修改为欲修改数值   V=5
 * todo  -else try V==Expected ?? 如果当前值3!=期望值4   继续尝试4?=4  NewVlaue=5
 * todo CPU原语支持  不可打断
 * todo  CAS 有可能出现ABA问题  A修改成B 有修改回A 对基本类型 null没啥影响,对引用类型有可能有影响
 * todo 解决办法 加版本号 version  用AtomicStampedReference解决ABA问题
 */
public class AtomicInteger1 {
	/*volatile*/ //int count1 = 0;
	
	AtomicInteger count = new AtomicInteger(0); 

	/*synchronized*/ void m() { 
		for (int i = 0; i < 10000; i++)
			//if count1.get() < 1000
			count.incrementAndGet(); //=count++
	}

	public static void main(String[] args) {
		AtomicInteger1 t = new AtomicInteger1();

		List<Thread> threads = new ArrayList<Thread>();

		for (int i = 0; i < 10; i++) {
			threads.add(new Thread(t::m, "thread-" + i));
		}

		threads.forEach((o) -> o.start());

		threads.forEach((o) -> {
			try {
				o.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		});

		System.out.println(t.count);

	}

}
